package org.qing.freepx.service.impl;

import java.util.List;

import org.qing.config.db.DbManager;
import org.qing.freepx.entity.IPProxy;
import org.qing.freepx.service.IPProxyService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import lombok.extern.slf4j.Slf4j;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

@Slf4j
@Service
public class IPProxyServiceImpl implements IPProxyService {

	@Autowired
	private DbManager dbManager;

	/**
	 * 实现发布者，并返回 0 或 1 个元素，即单对象
	 * 
	 * @return
	 */
	@Override
	public Mono<String> test() {
		log.debug("test,[IPProxyServiceImpl].....");
		return Mono.just("hello word");
	}

	/**
	 * 实现发布者，并返回 N 个元素，即 List 列表对象。
	 * 
	 * @param iPProxys
	 * @return
	 */
	@Override
	public Flux<IPProxy> createOrUpdate(Flux<IPProxy> iPProxys) {
		log.debug("iPProxys:{}",iPProxys);
		return iPProxys.doOnNext(
				iPProxy -> dbManager.writeToDatabase(iPProxy.getIp(), iPProxy, IPProxy.class, true));
	}

	/**
	 * 实现发布者，并返回 0 或 1 个元素，即单对象
	 * 
	 * @param iPProxy
	 * @return
	 */
	@Override
	public Mono<IPProxy> createOrUpdate(IPProxy iPProxy) {
		log.debug("iPProxy:{}",iPProxy);
		dbManager.writeToDatabase(iPProxy.getIp(), iPProxy, IPProxy.class, true);
		return Mono.just(iPProxy);
	}

	/**
	 * 实现发布者，并返回 0 或 1 个元素，即单对象
	 * 
	 * @param id
	 * @return
	 */
	@Override
	public Mono<IPProxy> deleteById(String ip) {
		log.debug("ip:{}",ip);
		IPProxy iPProxy = dbManager.readFromDatabase(ip, IPProxy.class);
		dbManager.deleteFromDatabase(ip);
		return Mono.justOrEmpty(iPProxy);
	}

	/**
	 * 实现发布者，并返回 N 个元素，即 List 列表对象。
	 * 
	 * @param ids
	 * @return
	 */
	@Override
	public Flux<IPProxy> getIPProxyBeanList(Flux<String> ips) {
		log.debug("ips:{}",ips);
		return ips.flatMap(ip -> Mono.justOrEmpty(dbManager.readFromDatabase(ip, IPProxy.class)));
	}

	/**
	 * 实现发布者，并返回 N 个元素，即 List 列表对象。
	 * 
	 * @return
	 */
	@Override
	public Flux<IPProxy> getAllIPProxyBeanList() {
		log.debug("get all ip proxy bean list");
		List<IPProxy> iPProxyList = dbManager.getAllFromDatabase(IPProxy.class);
        return Flux.fromStream(iPProxyList.stream());
	}

	/**
	 * 实现发布者，并返回 0 或 1 个元素，即单对象
	 * 
	 * @param id
	 * @return
	 */
	@Override
	public Mono<IPProxy> getIPProxyBeanById(String ip) {
		log.debug("get ip proxy bean by id id:{}",ip);
		return Mono.justOrEmpty(dbManager.readFromDatabase(ip, IPProxy.class));
	}

}
